/*
* getTemplate(id tplID)  参数,模板容器的id
* getTemplate.assign(key,value)  赋值,将数据赋值到模板中
* getTemplate.display(str elementID)   加载模板内容,将模板内容放置到elementID中
*           如果elementID为空，说明模板容器与放置容器是同一个
* getTemplate.action.setLimitR/setLimitL(str)  设置左右定界符
*
*/


function getTemplate(tplID) {
    var _this = this;         //保存自身指针
    var assignArr = [];       //定义一个哈希数组，存放assign的k,v
    var config = {           //配置项
        limitL: "{{",
        limitR: "}}",
        voidModify: '',      //如果模板元素无值，则显示为空
    }
    var limitArr = {          //私有变量，存储转义定界符
        '<': '&lt;',
        '>': '&gt;',
    };
    var encodeLimter = function (str) {     //私有方法，转义字符
        for (var tmp in limitArr) {
            if (str.search(tmp) >= 0) {
                str = str.replace(tmp, limitArr[tmp]);
            }
        }
        return str;
    };
    this.action = {                       //公有方法，修改定界符，空参数
        setLimitL: function (str) {
            config.limitL = encodeLimter(str);
            return _this;
        },
        setLimitR: function (str) {
            config.limitR = encodeLimter(str);
            return _this;
        },
        setVoidModify: function (str) {
            config.voidModify = str;
            return _this;
        }
    }
    this.assign = function (key, value) {
        //赋值，创建带有定界符哈希数组
        assignArr[config.limitL + key + config.limitR] = value;
        return this;
    };

    this.setValue = function (tempObj) {
        for (var tmp in tempObj) {
            this.assign(tmp, tempObj[tmp]);
        }
    }
    this.display = function (elementID) {
        try {
            var targetID = elementID || tplID;          //如果elementID为空，说明模板容器与放置容器是同一个
            var tmplate = document.getElementById(tplID).innerHTML;  //获取模板容器的内容
            var ptn = new RegExp(config.limitL + '(\\w+)?' + config.limitR, 'g');    //创建正则表达式
            var tmpRegArr = tmplate.match(ptn);               //存储所有符合条件的模板元素
            for (var i = 0; i < tmpRegArr.length; i++) {
                //移除模板内容中的标签，替换为值
                var changeStr = assignArr[tmpRegArr[i]] || config.voidModify;
                tmplate = tmplate.replace(tmpRegArr[i], changeStr);
            }
        } catch (e) {
            console.log(e.message);
            console.log("The limit code is not accord with your set");
        }
        document.getElementById(targetID).innerHTML = tmplate;
        return this;
    }

    this.append = function (elementID) {
        try {
            var targetID = elementID || tplID;          //如果elementID为空，说明模板容器与放置容器是同一个
            var tmplate = document.getElementById(tplID).innerHTML;  //获取模板容器的内容
            var ptn = new RegExp(config.limitL + '(\\w+)?' + config.limitR, 'g');    //创建正则表达式
            var tmpRegArr = tmplate.match(ptn);               //存储所有符合条件的模板元素
            for (var i = 0; i < tmpRegArr.length; i++) {
                //移除模板内容中的标签，替换为值
                var changeStr = assignArr[tmpRegArr[i]] || config.voidModify;
                tmplate = tmplate.replace(tmpRegArr[i], changeStr);
            }
        } catch (e) {
            console.log(e.message);
            console.log("The limit code is not accord with your set");
        }
        $(targetID).append(tmplate);
        return this;
    }
};

